//////////////////////////////////////////////////////////////////////////
// $Id: Local.cpp,v 1.1 2009/04/03 12:46:10 sunjun Exp $
//////////////////////////////////////////////////////////////////////////

#include "Local.h"

//////////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////////

NAMESPACE_BEGIN

//////////////////////////////////////////////////////////////////////////

	/*
	====================
	VA
	====================
	*/
	INLINE API const CHAR * CDECL VA( const CHAR *format, ... )
	{
		va_list	argptr;
		static CHAR	string[32000];	// in case va is called by nested functions

		va_start (argptr, format);
		_vsnprintf(string,sizeof(string), format,argptr);
		va_end (argptr);

		return( string );
	}
	
	/*
	====================
	MAssert
	====================
	*/
	INLINE API VOID CDECL MAssert( const CHAR * msg )
	{
	#ifdef WIN32
		::MessageBox( NULL, msg, "Assert", MB_OK | MB_ICONERROR | MB_TASKMODAL );
	#endif
	}

	/*
	====================
	MAssert
	====================
	*/
	INLINE API VOID CDECL MAssert( const CHAR * msg, const CHAR * filename, I32 line )
	{
		MAssert( VA("Assertion failed: %s [File:%s] [Line: %i]", msg, filename, line ) );
	}

	/*
	====================
	MPrint
	====================
	*/
	INLINE API VOID CDECL MPrint( const CHAR * msg )
	{

	}

	//////////////////////////////////////////////////////////////////////////

	/*
	====================
	MMalloc
	====================
	*/
	INLINE API VOID * CDECL MMalloc( U32 size, const CHAR * filename, I32 line )
	{
		return ::malloc( size );
	}

	/*
	====================
	MFree
	====================
	*/
	INLINE API VOID	CDECL MFree( VOID* p )
	{
		::free( p );
	}

	//////////////////////////////////////////////////////////////////////////

	/*
	====================
	MTokenize
	====================
	*/
	INLINE API std::vector<Str> CDECL MTokenize( const Str& in, CHAR split )
	{
		std::vector<Str>strcol;

		if( in.empty() ) return strcol;

		Str	str;

		const CHAR*	token = in.c_str();

		while( 1 ) {
			/* skip whitespace */
			while( *token && *token <= ' ' || *token == split )
			{
				token++;
			}

			if( !*token ) break;

			str.resize(0);

			// handle quoted strings
			if( *token == '\"' ) 
			{
				token++;
				while( *token && *token != '\"' ) 
				{
					str += *token++;
				}
				strcol.push_back( str );
				str.resize(0);
				if( !*token ) 
				{
					break;
				} 
				else 
				{
					token++;
					continue;
				}
			}

			do 
			{
				str+=*token; token++;
			} while( *token > ' ' && *token != split );
			strcol.push_back( str );
		}

		return strcol;
	}

//////////////////////////////////////////////////////////////////////////

NAMESPACE_END

//////////////////////////////////////////////////////////////////////////
